//package org.carota.pdf;
//
//import cn.hutool.core.lang.Assert;
//import lombok.Data;
//import lombok.extern.slf4j.Slf4j;
//import org.carota.itext5.*;
//
//import java.util.List;
//
///**
// * @author : AnWen
// * @version :1.0
// * @email : anwen375@qq.com
// * @since : 2023-03-29 19:02
// */
//@Data
//@Slf4j
//public class PdfProcessorBuilder {
//
//    private PdfProcessor processor;
//
//    public PdfProcessorBuilder() {
//        this.processor = new PdfProcessor ();
//    }
//
//    public PdfProcessorBuilder(Class<? extends PdfProcessor> clazz) {
//        try {
//            this.processor = clazz.newInstance ();
//        } catch (InstantiationException | IllegalAccessException e) {
//            log.error ("初始化异常", e);
//        }
//    }
//
//    public PdfProcessorBuilder template(String templatePdfPath) {
//        this.processor.setTemplatePath (templatePdfPath);
//        return this;
//    }
//
//    public PdfProcessorBuilder output(String outputPdfPath) {
//        this.processor.setOutputPdfPath (outputPdfPath);
//        return this;
//    }
//
//    public PdfProcessorBuilder ownerPassword(String password) {
//        this.processor.setOwnerPassword (password);
//        return this;
//    }
//
//    /**
//     * 默认注入PDF模板
//     */
//    public FillPdfTemplateConfigurer fillTemplate() {
//        return getOrApply (new FillPdfTemplateConfigurer (this));
//    }
//
//    /**
//     * 可以注入PDF模板以及PDF的子类
//     */
//    public <T extends FillPdfTemplateConfigurer> T fillTemplate(T configurer) {
//        configurer.setProcessor (this);
//        return getOrApply (configurer);
//    }
//
//    public AntiFakeConfigurer antiFake() {
//        return getOrApply (new AntiFakeConfigurer (this));
//    }
//
//    public <T extends AntiFakeConfigurer> T antiFake(T configurer) {
//        configurer.setProcessor (this);
//        return getOrApply (configurer);
//    }
//
//    public WaterMarkConfigurer waterMark() {
//        return getOrApply (new WaterMarkConfigurer (this));
//    }
//
//    public <T extends WaterMarkConfigurer> T waterMark(T configurer) {
//        configurer.setProcessor (this);
//        return (T) getOrApply (configurer);
//    }
//
//
//    public SignatureConfigurer signature() {
//        return getOrApply (new SignatureConfigurer (this));
//    }
//
//    public <T extends SignatureConfigurer> T signature(T configurer) {
//        configurer.setProcessor (this);
//        return (T) getOrApply (configurer);
//    }
//
//
//    public EncryptConfigurer encrypt() {
//        return getOrApply (new EncryptConfigurer (this));
//    }
//
//    public <T extends EncryptConfigurer> T encrypt(T configurer) {
//        configurer.setProcessor (this);
//        return getOrApply (configurer);
//    }
//
//
//    private <T extends PdfConfigurer> T getOrApply(T configurer) {
//        boolean contains = processor.getConfigurers ().contains (configurer);
//        return contains ? configurer : add (configurer);
//
//    }
//
//    private <T extends PdfConfigurer> T add(T configurer) {
//        processor.getConfigurers ().add (configurer);
//        return configurer;
//    }
//
//    public PdfProcessor build() {
//        Assert.notNull (processor.getTemplatePath (), "templatePath cannot be null");
//        processor.sort ();
//        List<PdfConfigurer> configurers = processor.getConfigurers ();
//        PdfConfigurer pdfConfigurer = configurers.get (configurers.size () - 1);
//        pdfConfigurer.setLastNode ();
//        return processor;
//    }
//}
